//
//  HOPHomeController.swift
//  WB01
//
//  Created by HOP on 15/12/15.
//  Copyright © 2015年 HOP. All rights reserved.
//

import UIKit

import SVPullToRefresh

enum HOPStatusCellReuseIdentifier: String {
case StatusNormalCell = "StatusNormalCell"
case StatusForwardCell = "StatusForwardCell"
}

class HOPHomeController: HOPBaseController {
    let tipLabelHeight: CGFloat = 44
    
    /// 微博数据
    var statuses: [HOPStatus]? {
        didSet {
        self.tableView.reloadData()
        }
    
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        if  !HOPuserAccount.userLogin {
        return
        }
        setNav()
        prepareTabelView()
//        loadStatus()
        refreshControl = HOPRefreshController()
        // 刷新控件监听下拉事件
        refreshControl?.addTarget(self, action: "loadNewStatus", forControlEvents: UIControlEvents.ValueChanged)
        // 主动进入刷新状态,只会让刷新控件界面显示刷新,并不会主动触发 UIControlEvents.ValueChanged 事件
        refreshControl?.beginRefreshing()
        // 主动触发 UIControlEvents.ValueChanged
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
         // 监听配图点击事件
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "pictureSelect:", name: HOPStatusPictureViewCellSelectNotification, object: nil)
        // 监听title按钮modal出来的控制器关闭
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "popoverDismiss", name: HOPPresentationControllerDismissNotificaiton, object: nil)
        }
    /// title按钮modal出的控制器关闭
    func popoverDismiss() {
    // 获取导航栏顶部的按钮
    let button = navigationItem.titleView as! HOPHomeTitleView
    // 让按钮转下来,直接调用
    BtnClick(button)
    
    }
    /// 微博配图被点击时监听的事件
    func pictureSelect(notice: NSNotification) {
    // 获取通知里面的信息
        guard let indexPath = notice.userInfo?[HOPStatusPictureViewCellSelectIndexPathKey] as? NSIndexPath else {
        print("indexPath 为空.")
        return
        }
    // 获取到大图的数组
        guard let models = notice.userInfo?[HOPStatusPictureViewCellSelectModelsKey] as? [HOPPhotoBrowserModal] else {
        print( "大图的数组为空")
            return
        }
    // 打开照片浏览器
        let photoBroswerVC = HOPPhotoBrowserController(indexPath: indexPath , models: models)
        // 实现照片选择器的转场动画
        // 不能使用self作为转场代理,因为self已经成为了标题栏按钮的的转场动画
        photoBroswerVC.transitioningDelegate = photoBroswerVC
        photoBroswerVC.modalPresentationStyle = UIModalPresentationStyle.Custom
        
        presentViewController(photoBroswerVC, animated: true, completion: nil)
    }
    func loadNewStatus() {
        // 如果没有微博数据, since_id设置为0,加载最新的20条
        // 如果有微博数据,获取最大id的微博
        let since_id = statuses?.first?.id ?? 0
        let max_id = 0
        // 1.调用微博模型来加载微博数据(微博模型),
        // 2.准备闭包
        HOPStatus.mLoadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            // 关闭刷新控件(结束刷新)
            self.refreshControl?.endRefreshing()
            // 7.1 判断错误
            if error != nil {
                print("加载微博数据出错")
                return
            }
            let count = statuses?.count ?? 0
            if since_id > 0 {
            self.showTipView(count)
            }
            if count == 0 {
            print("没有加载到数据")
            return
            }
            if since_id > 0 {
            self.statuses = statuses! + self.statuses!
            print("下拉刷新 加载到 \(count)条新数据")
            
            }else {
            self.statuses = statuses
                print("第一次进入程序, 加载了 \(count) 条微博数据")
            // 需要显示上拉加载更多地菊花
                self.tableView.showsInfiniteScrolling = true
            }
            print("总共有多少条数据: \(self.statuses?.count)")
        }

    }
    /// 显示下拉刷新了多少条数据
    private func showTipView(count: Int) {
        print("count\(count)")
        tipLabel.text = count == 0 ? "没有加载到新的微博数据" : "加载了\(count)条微博数据"
    // 添加到导航栏上面
    navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
    // 动画下来
    UIView.animateWithDuration(1.25, animations: { () -> Void in
    
            self.tipLabel.frame.origin.y = self.tipLabelHeight
          }) { (_) -> Void in
            
            UIView.animateWithDuration(1.25, delay: 1.25, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                
                self.tipLabel.frame.origin.y = -(self.tipLabelHeight + 20)
                }, completion: { (_) -> Void in
                    print("动画完成")
            })
        }
        }
    
    /// 上拉加载更多数据
    func loadMoreStatus() {
    let since_id = 0
    let max_id = statuses?.last?.id ?? 0
    HOPStatus.mLoadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
        // 关闭上拉加载更多数据的控件
        self.tableView.infiniteScrollingView.stopAnimating()
        if error != nil {
        print("// 关闭上拉加载更多数据的控件")
        return
        }
          // 没有出错
        let count = statuses?.count ?? 0
        if count == 0 {
            // 没有加载到数据
            print("没有加载到数据")
            return
        }
       // 加载到了数据
        if max_id > 0 {
      // 最终的数据 = 现有数据 + 获取到的数据
            self.statuses = self.statuses! + statuses!
            print("上拉加载到更多数据: \(count)条")
        }
        print("总共有多少条数据: \(self.statuses?.count)")
        
        
        }
    
    
    }
    private func prepareTabelView() {
        // 根据不同的模型显示不同的cell
        // 注册原创cell
        tableView.registerClass(HOPStatusNormalCell.self, forCellReuseIdentifier: HOPStatusCellReuseIdentifier.StatusNormalCell.rawValue)
        // 注册转发cell
        tableView.registerClass(HOPStatusForwardCell.self, forCellReuseIdentifier: HOPStatusCellReuseIdentifier.StatusForwardCell.rawValue)
        // 设置tableView的cell高度
        //        tableView.rowHeight = 400
        // 设置cell预估行高
        tableView.estimatedRowHeight = 200
        // 设置cell行高根据约束来自适应
        tableView.rowHeight = UITableViewAutomaticDimension
        // 去掉cell的分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
            print("加载更多数据")
            self.loadMoreStatus()
        }
        tableView.showsInfiniteScrolling = false
    }
    private func setNav() {
//        let leftBtn = UIButton()
//        leftBtn.setBackgroundImage(UIImage(named: "navigationbar_friendsearch"), forState: UIControlState.Normal)
//        leftBtn.setBackgroundImage(UIImage(named: "navigationbar_friendsearch_highlighted"), forState: UIControlState.Highlighted)
//        leftBtn.sizeToFit()
//       navigationItem.leftBarButtonItem = UIBarButtonItem(customView: leftBtn)
//        let rightBtn = UIButton()
//        rightBtn.setBackgroundImage(UIImage(named: "navigationbar_pop"), forState: UIControlState.Normal)
//        rightBtn.setBackgroundImage(UIImage(named: "navigationbar_pop_highlighted"), forState: UIControlState.Highlighted)
//        rightBtn.sizeToFit()
//        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightBtn)
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        let title = HOPuserAccount.loadUserAccount()?.screen_name ?? "没获取到用户名"
        // 创建title按钮
        let titleButton = HOPHomeTitleView(imageName: "navigationbar_arrow_down", title: title)
        // 添加点击事件
        titleButton.addTarget(self, action: "BtnClick:", forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
    }
    //title按钮点击事件
    func BtnClick(btn: UIButton) {
        btn.selected = !btn.selected
    UIView.animateWithDuration(0.25) { () -> Void in
        btn.imageView?.transform = btn.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.00001)) : CGAffineTransformIdentity
        }
        // 按钮选中的时候才弹出控制器
        if btn.selected {
            // 不能直接创建控制器,需要使用 Popover.storyboard 来加载控制器
            //            let popoverVC = CZPopoverController()
            // 1.加载storyboard
            let sb = UIStoryboard(name: "Popover", bundle: nil)
        // 2.加载sb里面的控制器
            let popoverVC = sb.instantiateViewControllerWithIdentifier("PopoverID")
        
        
            // 直接modal出来大小是和屏幕一样大小.需要通过自定义转场动画来控制modal出来的控制器的view的大小
            // 1. modal出来的控制器实现代理
            popoverVC.transitioningDelegate = self
        // 2. 设置modal的样式为自定的样式,如果不设置modalPresentationStyle modal出来控制器时,背后的控制器是不在.设置为UIModalPresentationStyle.Custom时,背后的控制器的view还处于显示状态,作用是让我们的转场动画元素丰富
            popoverVC.modalPresentationStyle = UIModalPresentationStyle.Custom
            presentViewController(popoverVC, animated: true, completion: nil)
        }
     }
    // MARK: - tableView数据源和代理
    
    // talbeView显示多少条数据
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 如果statuses没有数据,返回0
        return statuses?.count ?? 0
    }
    // 返回每个cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 取出对应的模型
        let status = statuses![indexPath.row]
        // 去缓存池中查找cell,如果缓存池中找不到可用的cell,会使用注册的cell类型来创建cell(UITableViewCell)
        let cellID = status.cellID()
        let cell = tableView.dequeueReusableCellWithIdentifier(cellID) as! HOPStatusesCell

        // 设置cell的微博模型
        
        cell.status = status
//        cell.textLabel?.text = status.text
        return cell
    }
//     MARK: - tableView数据源和代理
//     返回每个cell的高度
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 根据不同的模型,计算出cell的高度
        // 1.获取模型
        let status = self.statuses![indexPath.row]
        // 2.查看模型是否有缓存的行高,如果有缓存的行高直接返回
        if status.rowHeight != nil {
        print("返回缓存行高: \(status.rowHeight)")
        return status.rowHeight!
        }
        // 没有缓存行高
        // 3.获取cell,使用不带IndexPath方法
        let cellID = status.cellID()
        let cell = tableView.dequeueReusableCellWithIdentifier(cellID) as! HOPStatusesCell
        // 4.使用cell计算行高,每次都计算行高需要消耗性能,将行高进行缓存,行高是根据模型算出来的.行高缓存在模型中最合适
        let rowHeight = cell.rowHeight(status)
        // 5.保存计算好的行高
        status.rowHeight = rowHeight
       // print("计算行高 rowHeight: \(rowHeight)")
        return rowHeight
    }
        // MARK: - 懒加载
    /// 显示加载了几条新微博的view
    private lazy var tipLabel: UILabel = {
    // 创建label
    let tipLabel = UILabel(frame: CGRect(x: 0, y: -(self.tipLabelHeight + 20), width: UIScreen.mainScreen().bounds.width, height: self.tipLabelHeight))
        tipLabel.textColor = UIColor.whiteColor()
        tipLabel.textAlignment = NSTextAlignment.Center
        tipLabel.font = UIFont.systemFontOfSize(16)
        tipLabel.backgroundColor = UIColor.orangeColor()
    return tipLabel
    }()
}
// MARK: - 扩展 CZHomeViewController 实现转场代理
extension HOPHomeController: UIViewControllerTransitioningDelegate {

    /// 返回一个控制展现(显示)的对象.这个对象里面可以设置modal出来的控制器的view的大小
    func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController, sourceViewController source: UIViewController) -> UIPresentationController? {
        // 这个方法需要返回一个UIPresentationController,现在我们没有这个对象,
        // 1.创建一个类继承UIPresentationController类,
        // 2.用这个类创建对象,返回回去
        // 注意,不能调用空参数的构造方法不然会报: NSetM addObject: obj不能为nil
       return HOPPresentationController(presentedViewController: presented, presentingViewController: presenting)
        }

/// 返回一个控制modal时的动画的对象
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // 1.创建一个类实现UIViewControllerAnimatedTransitioning
        // 2.用这个类创建对象,并返回回去
        return HOPPopoverAnimation()
    }
/// 返回一个控制dismiss时的动画的对象
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // 1.创建一个类实现UIViewControllerAnimatedTransitioning
        // 2.用这个类创建对象,并返回回去
        return HOPDismissAnimation()
    }
}






















